今天續講GDB。
之前可以trace SQLITE時,心情很激動,畢竟你不可能有MS SQL2008, MS SQLEXPRESS, IE 8/9 的source code 去偵錯trace,當大陸出了一本可以從windows 核心有源碼可以trace時,真讓人意外。
Bill GATES 早期曾以一篇有關軟體智慧財產權,軟體要付費的讀者投書,在電腦史上留名。聽說是一個運作不太良好的basic的編譯器,只有二進位碼,不允許使用者未經授權散布錄音帶。然後之後的故事,就是一步一步的成就微軟的榮景,大家耳熟能詳。
才知道,在那之前,軟體因為搭配硬體,是附屬,所以是不收費,沒有專賣軟體的公司,在MIT,柏克萊大學,大家的軟體都是互相分享的,也是hacker文化流行的時代,你改我的code,我hack你的code。之後商業軟體公司興起,就不太分享了,
史托曼先生在MIT經歷了從大家分享,到大家不分享source的時代。
他堅持他的理念,所以沒有商業軟體公司敢用他,甚至學校單位也怕怕,自由軟體先驅在1980年代,算是一個人,少數人慢慢的前進。還好學生有熱情,學生裏的高手總是源源不絕,有人認同自由軟體的概念,會願意付費給史托曼讓他加強emacs的功能,即使他的客戶裏不乏lisp的高手(早中期的程式高手幾乎都會lisp,可以看最近一本關於程式高手訪談的書,但是高到無法想像,像Knuth這類的理論和實戰的神者,可能會不會某種語言一點意義都沒有。),應是英雄惜英雄吧。或是
只有史托曼能寫出魔幻emacs的功能,值得付費吧。用到了才知道吧!!
上面這張圖,是EMACS 的GDB,又稱GUD. 如果昨天的指令不想背(或是背不起來),用功能鍵(tool bar )上的圖示,也是一樣的效果,
圖的左上,是給硬要下指令的人用的,
圖的左中是目前執行到那裏
圖的左中是你已經鑽進了幾層函式,所謂的堆疊(stack),一層一層的step in。
圖的右上是一些變數的值,還有暫存器的值(筆者看不懂)
圖的右中,筆者不會用,GUD自己又不會帶東西出來,沒法望文生義。
圖的右下,就是你設的中斷點,基本上,筆者在混的時候,就設main()(程式進入點,等於沒有想法,漫無目的的trace程式。
一些題外話:
timloo@ubuntu:~/sqlite-src$ gcc -o t01 t01.c -lsqlite3
timloo@ubuntu:~/sqlite-src$ ls -l t01
-rwxr-xr-x 1 timloo timloo <strong>8500</strong> 2011-10-08 18:02 t01
timloo@ubuntu:~/sqlite-src$ gcc sqlite3.c -lpthread -ldl t01.c -g -o t01
timloo@ubuntu:~/sqlite-src$ ls -l t01
-rwxr-xr-x 1 timloo timloo <strong>1027320 </strong>2011-10-08 18:03 t01
timloo@ubuntu:~/sqlite-src$ gcc sqlite3.c -lpthread -ldl t01.c -o t01
timloo@ubuntu:~/sqlite-src$ ls -l t01
-rwxr-xr-x 1 timloo timloo <strong>580340</strong> 2011-10-08 18:04 t01
筆者的第一種編譯方式,是把sqlite3 當成動態連結庫來連結,所以體積小,
沒法除錯進入sqlite3。
第二種編譯方式,把sqlite3的源代碼一起併入,且要除錯(-g),看得出來爆肥。
第三種編譯方式,把sqlite3的源代碼一起併入,不要除錯,大小少了過一半,可見得為了要除錯,gcc寫入的資訊還不少。而筆者目前用的tiptop6.x基本上因為是
近30年的老東西,還是用這種所謂的靜態連結的方式,把共用libray,一個不少的含進來。和第一種比起來體積差異很大。從數字的大小,來感受動態連結庫的重要。
這次的code:
timloo@ubuntu:~/sqlite-src$ cat t01.c
#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
int main(int argc, char **argv)
{
sqlite3 *db;
char *zErr;
int rc;
char *sql;
rc = sqlite3_open("timlo.db", &db);
if(rc) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
sql = "create table episodes(name text, cid int)";
rc = sqlite3_exec(db, sql, NULL, NULL, &zErr);
if(rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", zErr);
}
sqlite3_close(db);
return 0;
}
看得出來是抄入門(tutorial)或是快速入門(get started)來
的。昨天用sqlite的shell 來當範例,一看上千行,貼都懶得貼。
且讓人容易失焦,一個簡易的shell比想像的困難多了。
倒不如入門的code,附圖就是
trace sqlite3_open的截圖。
小結:
oxlab的核心developer Jserv 大牛在今年的cosup上做一個20萬元的分享,
簡報中提到,在google 釋出(release) android的 核心(kernel) 源碼(source),
他生平第一次覺得地球是平的,和資訊大廠(intel,arm,ibm…)是平起平坐,是
公平的。除了能一視同仁取得,他甚至能更早取得(因為地球自轉的時差,因為他晚上不睡覺)。
在開源社群,不管是GCC,KERNEL,實現了一種烏托邦式的平等,你可以和
神級的大牛討論事情,你也可以提交你的code。當你是maitainer時,你也可以
拒絕不合理的bug fix(用patch比較好)。大家是平等的,不是看財產,看頭銜,看位階,看大廠小廠(這時想到emba,不少班是以公司規模,職稱在選學生的)。
今天要去看賽德克下集,在台中的日新影城,同一間辦公室的同事竟只我一人看,就像他們都有iphoone,筆者沒有一樣!!